package com.gking.centerSystem.AOP;


import com.gking.centerSystem.AOP.annotationUtil.configFunctionSwitch.ConfigFunctionSwitch;
import com.gking.centerSystem.common.Result;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;

import java.util.Map;


@Slf4j
@Aspect
//@Component  // 移除组件声明，成为抽象类或者普通类，无法被识别为Bean，只提供通用的切面逻辑
abstract class ConfigFunctionSwitchAspect {

    /**
     * 获取系统功能开关状态，子类继承后需要重写该方法
     *
     * @param code 系统功能开关 唯一编码
     * @return 返回一个Map {"status":true/false, "disableMsg":"功能关闭提示信息"}
     */
    public abstract Map getConfigFunctionSwitchStatus(String code);

//    public Map getConfigFunctionSwitchStatus(String code) {
//        // 1.从数据库中提取出该 功能的状态编码 对应的功能信息
//
//        // 2.功能开启则返回true, 功能关闭则返回false
//
//        // 3. 返回封装的Map
//        return null;
//    }


    // 针对某些系统功能，是否可以访问
    @Around("@annotation(configFunctionSwitch)")
    public Object verifyStatus(ProceedingJoinPoint joinPoint, ConfigFunctionSwitch configFunctionSwitch) throws Throwable {
        String code = configFunctionSwitch.code();
        Map configFunctionSwitchStatus = getConfigFunctionSwitchStatus(code);

        boolean status = (boolean) configFunctionSwitchStatus.get("status");
        if (status) return joinPoint.proceed();

        String disableMsg = (String) configFunctionSwitchStatus.get("disableMsg");
        if (disableMsg.isEmpty()) disableMsg = "该功能已关闭";

        return Result.error(disableMsg);
    }

}
